package com.example.design_pattern.singleton.doublecheck;

/**
 * 双重检查加锁
 * 线程安全
 */
public class Singleton {

	// 对象的创建可能发生指令的重排序，使用 volatile可以禁止指令的重排序，保证多线程环境内的系统安全。
	private volatile static Singleton uniqueInstance;

	private Singleton() {}

	public static Singleton getInstance() {
		if (uniqueInstance == null) { // 第一次检查
			synchronized (Singleton.class) {
				if (uniqueInstance == null) { // 第二次检查（防止 其他线程获取过锁，已经初始化改变量
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}
